/* KLASSLISTA UPPGIFT PROG-B OKTOBER 2006
   Filen elever.txt måste finnas i aktuell katalog 
   
   -= Funktionernas namn kan vara lite förvirrande
   då programmet är en lista över personer och deras 
   telefonnummer  =- 
     
   Funktioner:
   drawmenu Ritar upp användargränssnitt
   drawList Skriver ut hela listans innehåll
   addCd    Lägger till ett objekt i listan
   searchCD Söker och returnerar ett objekt i listan
   bubbelSort Sorterar listan i bokstavsordning
   */

#include <iostream>
#include <stdlib.h>
#include <string>
#include <fstream>
#include <conio.h>              //för getch(); och sleep()
using namespace std;

int counter=0;                  //global variabel används av flera funktioner
struct elev{
       string namn;
       string resultat;         //eg.telefonnummer
       };                    
void drawmenu();                      
void drawList( elev array[]);
void addCd    (elev array[]);
void bubbelSort(elev array[], int antal);
void searchCd (elev array[], int antal);

/* START */ 
int main()
{
 elev klasslista [50];          
 
// INITIERING elever.txt läses till klasslista[]
 
string temp;                           //används av första inläsningem
ifstream inFil;                    //objektet infil=>som cin men källa kan styras    
inFil.open("elever.txt");         //Styr vilken fil (källa) som skall läsas in

   if(inFil.fail())                          //Felhantering – om filen ej kan öppnas
   {
   cerr<<"Filen kunde ej \x94ppnas - bailing out!";
      getch(); 
   exit(1);
   }
   
//FÖRSTA INLÄSNINGEN SKER UTANFÖR LOOPEN - OM DEN ÄR OK STARTAR LOOPEN
getline(inFil,temp);      //läser till temporär string
if(inFil.eof())           //om tom fil läses EndOfFile in i.s.f avbryt
cout<<"FILEN \x8eR TOM!"<<endl;
else
{
  for(int i=0; !inFil.eof()&&!inFil.fail() ;i++)   //så länge inte eof() eller fail()
   {           
   klasslista[i].namn=temp;
   getline(inFil,klasslista[i].resultat);
   //inFil.ignore(1000,'\n');                        //läser bort EOL
   counter++;
   getline(inFil,temp);   
   }
}
 inFil.close(); 
// INLÄSNING TILL ARRAY KLAR /*/*/

//Switch case sats *****switchar beroende på värde för val ************************ 
int val=0;
while(val != 5)
 {
  system("CLS");
  drawmenu();  //RITAR MENU    
  cin>>val;
  cin.ignore(1000,'\n');
  switch (val) 
        { 
        case 1:                 
                drawList( klasslista); 
                getch();
                break; 
        case 2:                 
                bubbelSort(klasslista, counter); 
                break; 
        case 3:                 
                addCd    (klasslista); 
                break;
        case 4: 
                searchCd (klasslista,counter);
                break; 
        case 5: 
                cout<<"AVSLUTAR"<<endl; 
                getch();
                break;
        default: 
                cout<<"Felaktig inmatning! Tryck Enter!"<<endl;
                getch(); 
        }
  }    
//END * *  ANVÄNDARGRÄNSSNITT OCH VALALTERNATIV 
 
//PROGRAMAVSLUTNING  = case 5: Skriver klasslista till filen elever.txt                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
ofstream tillFil;
tillFil.open("elever.txt");

cout<<"Telefonlistan uppdateras"<<endl;

sleep(200); //just for fun!

cout<<"klart"<<endl;

for(int i=0; i<counter; i++)           // skriver uppdaterad lista till fil
  {
         tillFil<<klasslista[i].namn<<endl;
         tillFil<<klasslista[i].resultat<<endl;
          }           
tillFil.close();
getch();        
return 0;
} //END of PROGRAM.




/*
FUNKTIONSDEFINITIONER 
*/
// FUNKTION DRAW MENU ---------------------------------------------------------------
void drawmenu()
{
cout<<endl;
cout<<endl;
cout<<" ************* = = TELEFONLISTA = =***********"<<endl<<endl;
cout<<"   Vill du:"<<endl;
cout<<"   Se hela listan?          Ange 1"<<endl;
cout<<"   Sortera efter namn?      Ange 2"<<endl;
cout<<"   Lägga till post?         Ange 3"<<endl;
cout<<"   S\x94ka namn ?              Ange 4"<<endl;
cout<<"   Avsluta ?                Ange 5"<<endl;

cout<<endl<<endl<<" ******************************************"<<endl;
}
// FUNKTION drawList ----- Skriv ut arrayinnehåll till monitor -----------------------

 void drawList( elev array[])
 {system("cls");
 cout<<endl;
  for(int i=0; i<counter; i++)
  {
          cout<<array[i].namn<<endl;
          cout<<array[i].resultat<<endl;
          cout<<endl;
          }
}
//Funktion AddCd---------------------------------------------------------------------
void addCd    (elev array[])
{
cout<<endl<<"L\x84gg till ytterligare poster i telefonlistan avsluta med # f\x94r namn"<<endl;
cout<<"Tryck f\x94rst enter";
 getch();          //väntar på knapptryckning
 system("CLS");    //rensar skärmen
 
string tempnamn; 
cout<<"ange namn (# f\x94r att avsluta): ";
getline(cin,tempnamn);
       
for(int i=counter; tempnamn!="#"; i++)
  {
       array[i].namn=tempnamn;
        cout<<"ange telenummer: ";
         getline(cin,array[i].resultat);
          // cin.ignore(1000,'\n');
            system("CLS");
             cout<<"ange namn(# f\x94r att avsluta): ";
              getline(cin,tempnamn);
               counter++;
          }
}
//Funktion bubbleSort ---------------------------------------------------------------
void bubbelSort(elev array[], int antal)
{
     for(int m=antal-1; m>0; m--)
     {
        for(int n=0; n<m;n++)
        {
          if(array[n].namn > array[n+1].namn)
          { 
             elev temp=array[n];
             array[n]=array[n+1];
             array[n+1]= temp;
             }
          }
        }
        
for(int i=0; i<6; i++)
{
cout<<(char)219; 
sleep(200);
}
cout<<endl;
sleep(300);
cout<<"klart"<<endl;
getch();      
}

//FUNKTION SÖK_CD  ---------------------------------------------------------------
void searchCd (elev array[], int antal)
{string objekt;
     bool hit=0;
     cout<<"Ange s\x94kstr\x84";
     getline(cin,objekt);
     
     for(int i=0; i<antal; i++)
     {
             if(array[i].namn==objekt)
             {
             cout<<"Objektet hittades på plats "<<i+1;
             cout<<endl<<array[i].namn;
              cout<<endl<<array[i].resultat;
              hit=1;
              }
     }
     if (hit==0)   
     cout<<"Objektet finns ej i listan";   
     
     getch();      
              
 }

// THE END